두개 뽑아서 더하기

📔 문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 2개의 수를 뽑아 더 해 만들 수 있는 모든 수를 배열에 오른차순으로 담아 반환하는 solution() 함수를 완성하세요

📓 제약 조건

numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.

📓 입출력의 예

numbers result
[2,1,3,4,1] [2,3,4,5,6,7]
[5,0,2,7] [2,5,7,9,12]

❗ 1번째

해야 할 일에 대한 생각 부터 해보자

  1. 배열에서 서로 다른 인덱스에있는 값 2개를 뽑아 더하기
  2. 그러나 중복값은 허용하지 않는 것으로 보여 중복 제거
  3. 오른차순으로 담아 반환하기

✅ 실행 코드

function solution(arr){
  const set = new Set
  for (let i = 0; i < arr.length; i++) { 
    for (let j = 0; j < i; j++){ 
      set.add(arr[i] + arr[j]) // 순회하여 모든 값이 전부 서로 더하기 하기
    }
  }
  let result = [...set] // set 객체를 배열로 변환
  result.sort((a,b) => a - b) // 정렬
  return result
}

❗ 2번째

위의 코드는 for문을 사용하여 문제를 풀었지만 나는 자바스크립트를 활용하여 코테를 봐야하고 내 알고리즘 실력을 늘리기 위해 reduce를 활용해보기로했다

완성된 코드를 조금 설명하자면 reduce의 누산값을 set 객체로 잡고 추가하는 방식으로 하기위해 set, current값 index값을 매개변수로 받고 이걸 어떻게 해야 모든수를 도는데 자기자신을 제외하고 전부 더해 볼지 고민하다 reduce의 index값을 활용해서 배열의 자기자신 전까지 slice된값을 forEach로 순회하면서 current값과 더해 set 객체에 추가하는 식이다

그후 배열로 변환된 set 배열을 정렬하고 리턴해주는 코드다

✅ 실행 코드

function solution(arr) {
  const set = [...arr.reduce((set, cur, i) => {
    arr.slice(0,i).forEach(prev => set.add(prev + cur))
    return set
  }, new Set())] 
  set.sort((a , b) => a - b)
  return set
}


📚 문제 느낀점

문제의 핵심을 파악하고 첫번째 방식으로 작성하는방법은 매우 쉬웠지만 이걸 자바스크립트의 고차함수를 활용하여 생각하니 익숙치 않아 머리가 너무 아픈 문제였다.


© 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/68644?language=javascript